package factory.demo3;

import factory.demo3.service.AbstractFreezer;
import factory.demo3.service.AbstractTV;

/**
 * 抽象工厂:
 * 优点:
 * 1.对于不同产品系列有较多共共同特征时候,可以使用抽象工厂模式,有助于提升组件的复用性;
 * 2.当需要提升代码的扩展性并降低维护成本时,把创建对象和使用过程分开,能有效的将代码统一到一个级别上;
 * 3.解决了跨平台带来的兼容性问题;
 *
 * 缺点:
 * 增加新的产品等级结构麻烦,需要对原有的结构进行较大的修改,甚至需要修改抽象层代码,
 *
 *
 *
 *
 * @author 1
 * @version 1.0
 * @description: TODO
 * @date 2024-08-28 15:40
 */
public class Client3 {
    private AbstractTV tv;
    private AbstractFreezer freezer;


    /**
     * 构造方式来创建工厂对象
     *
     * @param appliancesFactory
     */
    public Client3(AppliancesFactory appliancesFactory) {
        this.tv = appliancesFactory.creatTV();
        this.freezer = appliancesFactory.creatFreezer();
    }

    public static void main(String[] args) {
        //创建海尔工厂
        Client3 client = new Client3(new HairFactory());
        //获取海尔电视,通过抽象工厂创建海尔电视对象
        AbstractTV tv = client.getTv();
        System.out.println(tv);
        //获取海尔冰箱,通过抽象工厂创建海尔冰箱对象
        AbstractFreezer freezer = client.getFreezer();
        System.out.println(freezer);

    }


    /**
     * getter和setter
     */
    public AbstractTV getTv() {
        return tv;
    }

    public void setTv(AbstractTV tv) {
        this.tv = tv;
    }

    public AbstractFreezer getFreezer() {
        return freezer;
    }

    public void setFreezer(AbstractFreezer freezer) {
        this.freezer = freezer;
    }
}
